'''
模型层,用于存储数据和处理数据
'''

'''
title: 标题：天通苑一区19号楼3层...
total_price: 总价格
position: 地理位置: 北京、上海
area: 面积
estate: 小区名
'''


class House:
    __house_list = []  # 此列表用于存储所有的房子信息

    def __init__(self, title, total_price, position, area, estate):
        # 创建对象时。要对每一个对象添加id信息，
        # 如果没有房子，此时id为1,
        # 如果没有房子__house_list 不为空,取所有房子的id的最大值+1
        # self.__id = max(self.__house_list, key=lambda h: h.__id).__id + 1 if self.__house_list else 1
        if self.__house_list:
            # 1. 先找到id最大的一套房子a_house = {House} <__main__.House object at 0x7f5e40549f30>
            a_house = max(self.__house_list,
                          key=lambda h: h.__id)
            self.__id = a_house.__id + 1  # 将最大一套房子的id+1即为当前房子的id
        else:
            self.__id = 1
        self.__title = title  # 标题： 天通苑一区18号楼...
        self.__total_price = total_price  # 总价格
        self.__position = position  # 地理位置
        self.__area = area  # 面积
        self.__estate = estate  # 小区名

    @property
    def id(self):
        return self.__id

    # 添加所有属性的 getter 方法
    @property
    def title(self):  # 标题
        return self.__title

    @property
    def total_price(self):  # 总价格
        return self.__total_price

    @property
    def position(self):  # 地理位置
        return self.__position

    @property
    def area(self):  # 面积
        return self.__area

    @property
    def estate(self):  # 小区名
        return self.__estate

    # 添加一个虚拟的单价属性
    @property
    def unit_price(self):  # 单价，由计算得到
        return self.__total_price / self.__area

    @classmethod
    def add_house(cls, title, total_price, position, area, estate):
        '''添加新房源'''
        # 创建一个房子类型的对象。
        a_house = cls(title, total_price, position, area, estate)
        # 放入列表
        cls.__house_list.append(a_house)

    @classmethod
    def get_house_list(cls):
        '''返回所有的房源信息的列表'''
        return cls.__house_list

    @classmethod
    def save_house_info(cls, filename='house.csv'):
        '''保存房源信息，成功返回True, 失败返回False'''
        try:
            with open(filename, 'w', encoding='gbk') as fw:
                # 遍历所有的房子，将信息写入.csv 文件
                for a_house in cls.__house_list:
                    fw.write(str(a_house.id))
                    fw.write(',')
                    fw.write(a_house.title)
                    fw.write(',')
                    fw.write(str(a_house.total_price))
                    fw.write(',')
                    fw.write(a_house.position)
                    fw.write(',')
                    fw.write(str(a_house.area))
                    fw.write(',')
                    fw.write(a_house.estate)
                    fw.write('\r\n')  # 标准 csv文件以'\r\n' 作为换行符
        except OSError:
            return False  # 文件操作失败返回 False
        return True

    @classmethod
    def load_house_info(cls, filename='house.csv'):
        try:
            with open(filename, 'r', encoding='gbk') as fr:
                # 清空原有的列表
                cls.__house_list.clear()
                # 读取文件内的数据，形成House对象，添加到 __house_list 列表中
                for aline in fr:
                    aline = aline.strip()  # 去掉空白字符
                    infos = aline.split(',')  # 以英文的逗号拆分各个列（字段）形成字符串列表
                    id, title, total_price, position, area, estate = infos
                    id = int(id)
                    total_price = float(total_price)
                    area = float(area)
                    a_house = cls(title, total_price, position, area, estate)
                    # 修改房子的id
                    a_house.__id = id
                    cls.__house_list.append(a_house)
        except OSError:
            return False
        return True

    @classmethod
    def modify_house_total_price(cls, id, new_price):
        '''修改id对应房子的总价'''
        if new_price < 0:
            return False
        # 查找id对应的房子
        for a_house in cls.__house_list:
            if id == a_house.id:  # 找到了
                a_house.__total_price = new_price
                return True
        return False  # 没有找到对应的房子
    @classmethod
    def remove_house(cls, id):
        '''根据id删除房子'''
        for index, a_house in enumerate(cls.__house_list):
            if id == a_house.id:
                del cls.__house_list[index]
                return True
        return False
# ctrl + alt + L  格式化代码为PEP8编码规范

if __name__ == '__main__':
    # House.add_house('回龙观3居室急售', 2000000, '北京', 120, '回龙观')
    # House.add_house('东方家园1居', 1200000, '上海', 40, '东方家园')
    # House.add_house('东方家园2居', 2200000, '重庆', 60, '东方家园')
    # House.save_house_info()
    House.load_house_info()

